﻿using System.Text.RegularExpressions;
using System.Windows;
using System.Windows.Input;

namespace MainUI
{
    public partial class CustomSizeDialog : Window
    {
        // 自定义尺寸有效范围
        private const int MinSize = 10;
        private const int MaxSize = 7680;

        // 用户最终选择的尺寸
        public int SelectedWidth { get; private set; }
        public int SelectedHeight { get; private set; }

        public CustomSizeDialog(int defaultWidth = 800, int defaultHeight = 600)
        {
            InitializeComponent();

            // 初始化显示格式：宽度x高度
            SizeInputBox.Text = $"{ClampValue(defaultWidth)}x{ClampValue(defaultHeight)}";
        }

        #region 输入验证逻辑
        // 实时输入验证（允许数字和x/X）
        private void SizeInputValidation(object sender, TextCompositionEventArgs e)
        {
            var regex = new Regex(@"^[\dxX]+$");
            e.Handled = !regex.IsMatch(e.Text);
        }

        // 失去焦点时自动格式化
        private void SizeInputBox_LostFocus(object sender, RoutedEventArgs e)
        {
            FormatInputText();
        }

        private void FormatInputText()
        {
            var input = SizeInputBox.Text.Trim();

            // 自动转换大写X为小写
            input = input.Replace('X', 'x');

            // 分割输入值
            var parts = input.Split('x');

            // 尝试解析数值
            var validWidth = int.TryParse(parts.Length > 0 ? parts[0] : "", out int width);
            var validHeight = int.TryParse(parts.Length > 1 ? parts[1] : "", out int height);

            // 生成规范格式
            var formattedWidth = validWidth ? ClampValue(width).ToString() : "800";
            var formattedHeight = validHeight ? ClampValue(height).ToString() : "600";

            SizeInputBox.Text = $"{formattedWidth}x{formattedHeight}";
        }
        #endregion

        #region 核心业务逻辑
        // 确定按钮点击事件
        private void OK_Click(object sender, RoutedEventArgs e)
        {
            if (ValidateInput())
            {
                DialogResult = true;
                Close();
            }
        }

        // 取消按钮点击事件
        private void Cancel_Click(object sender, RoutedEventArgs e)
        {
            DialogResult = false;
            Close();
        }

        // 输入验证（带详细错误提示）
        private bool ValidateInput()
        {
            var input = SizeInputBox.Text.Trim();

            // 基本格式验证
            if (!Regex.IsMatch(input, @"^\d+x\d+$"))
            {
                ShowError("格式错误", "请输入有效的尺寸格式（示例：800x600）");
                return false;
            }

            // 分割并解析数值
            var parts = input.Split('x');
            if (!int.TryParse(parts[0], out int width) ||
                !int.TryParse(parts[1], out int height))
            {
                ShowError("数值错误", "宽度和高度必须为整数");
                return false;
            }

            // 范围验证
            var errorMsg = new System.Text.StringBuilder();
            if (width < MinSize || width > MaxSize)
                errorMsg.AppendLine($"宽度需在{MinSize}-{MaxSize}之间");

            if (height < MinSize || height > MaxSize)
                errorMsg.AppendLine($"高度需在{MinSize}-{MaxSize}之间");

            if (errorMsg.Length > 0)
            {
                ShowError("范围错误", errorMsg.ToString());
                return false;
            }

            SelectedWidth = width;
            SelectedHeight = height;
            return true;
        }

        private void ShowError(string title, string message)
        {
            MessageBox.Show(message, title,
                MessageBoxButton.OK, MessageBoxImage.Error);
            SizeInputBox.Focus();
        }

        // 值范围钳制（兼容低版本.NET）
        private int ClampValue(int value)
        {
            if (value < MinSize) return MinSize;
            return value > MaxSize ? MaxSize : value;
        }
        #endregion

        #region 高级输入控制
        // 拦截非法粘贴内容
        protected override void OnPreviewKeyDown(KeyEventArgs e)
        {
            if (e.Key == Key.V && (Keyboard.Modifiers & ModifierKeys.Control) == ModifierKeys.Control)
            {
                if (Clipboard.ContainsText() &&
                    !Regex.IsMatch(Clipboard.GetText(), @"^\d+x\d+$"))
                {
                    e.Handled = true;
                }
            }
            base.OnPreviewKeyDown(e);
        }
        #endregion
    }
}